package cn.flying.cloud.base.common.excel;


import javax.servlet.http.HttpServletResponse;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.function.Consumer;

import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import cn.flying.cloud.base.common.exception.CommonException;
import cn.flying.cloud.base.common.utils.Ft;

/**
 * Excel处理默认实现
 *
 * @author: admin
 * @date: 2024年11月26日 11:31
 * @version: 1.0
 */
@Component
public class DefaultExcelServiceImpl implements ExcelService {

    /**
     * 将数据列表写入Excel文件并响应给请求
     *
     * @param response  请求响应
     * @param fileName  文件名
     * @param sheetName Excel sheet 名
     * @param head      Excel head 头
     * @param data      数据列表
     */
    @Override
    public <T> void writeExcel(HttpServletResponse response, String fileName, String sheetName, Class<T> head, List<T> data) {
        try (OutputStream outputStream = response.getOutputStream()) {
            Ft.Excel.setResponse(response, fileName);
            Ft.Excel.writeExcel(outputStream, fileName, sheetName, head, data);
        } catch (Exception e) {
            throw new CommonException(e.getMessage());
        }
    }

    /**
     * 根据模板导出，写入Excel文件并响应给请求
     *
     * @param response     请求响应
     * @param templatePath
     * @param fileName     文件名
     * @param sheetName    Excel sheet 名
     * @param head         Excel head 头
     * @param data         数据列表
     */
    @Override
    public <T> void writeExcel(HttpServletResponse response, String templatePath, String fileName, String sheetName, Class<T> head, List<T> data) {
        try (OutputStream outputStream = response.getOutputStream()) {
            Ft.Excel.setResponse(response, fileName);
            Ft.Excel.writeExcel(outputStream, templatePath, fileName, sheetName, head, data);
        } catch (Exception e) {
            throw new CommonException(e.getMessage());
        }
    }

    /**
     * 读取Excel，同步返回数据（不建议解析大数据量使用）
     *
     * @param file          Excel文件
     * @param head          实体类映射
     * @param sheet         sheet
     * @param headRowNumber
     */
    @Override
    public <T> List<T> readExcel(MultipartFile file, Class<T> head, int sheet, Integer headRowNumber) {
        try (InputStream inputStream = file.getInputStream()) {
            return Ft.Excel.readExcel(inputStream, head, sheet, headRowNumber);
        } catch (Exception e) {
            throw new CommonException(e.getMessage());
        }
    }

    /**
     * 读取Excel
     *
     * @param file          Excel文件
     * @param head          实体类映射
     * @param sheet         sheet
     * @param headRowNumber 表格头所在行
     * @param list          返回的数据
     * @return 返回
     */
    @Override
    public <T> List<T> readExcel(MultipartFile file, Class<T> head, int sheet, Integer headRowNumber, List<T> list) {
        try (InputStream inputStream = file.getInputStream()) {
            return Ft.Excel.readExcel(inputStream, head, sheet, headRowNumber, list);
        } catch (Exception e) {
            throw new CommonException(e.getMessage());
        }
    }

    /**
     * 读取Excel
     * 读取之后直接根据传入的处理类调用处理，每500条数据处理一次，不返回数据
     *
     * @param file          Excel文件
     * @param head          实体类映射
     * @param sheet         sheet
     * @param headRowNumber 表格头所在行
     * @param consumer      处理类
     */
    @Override
    public <T> void readExcel(MultipartFile file, Class<T> head, int sheet, Integer headRowNumber, Consumer<List<T>> consumer) {
        try (InputStream inputStream = file.getInputStream()) {
            Ft.Excel.readExcel(inputStream, head, sheet, headRowNumber, consumer);
        } catch (Exception e) {
            throw new CommonException(e.getMessage());
        }
    }
}